from django.shortcuts import render,redirect
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View

from myapp.models import User
import json
from django.core.serializers import serialize
from rest_framework.response import Response
from rest_framework.views import APIView
#导入加密库
import hashlib
#导入图片库
#绘画库
from PIL import ImageDraw
#字体库
from PIL import ImageFont
#图片库
from PIL import Image
#随机库
import random
#文件流
import io

import requests

#导入上传文件夹配置
from mydjango.settings import UPLOAD_ROOT
import os

#导入原生sql模块
from django.db import connection

import jwt

#导入redis数据库
import redis

#导入时间模块
import time

#导入公共目录变量
from mydjango.settings import BASE_DIR

#导包
from django.db.models import Q,F

#导入dwebsocket的库
from dwebsocket.decorators import accept_websocket
import uuid


#定义地址和端口
host = '127.0.0.1'
port = 6379

#建立redis连接
r = redis.Redis(host=host,port=port)


# 手写md5加密方法
def make_password(mypass):
    #生成md5对象
    md5 = hashlib.md5()
    # 定义加密对象
    sign_str = mypass
    # 转码
    sign_utf8 = str(sign_str).encode(encoding='utf-8')
    # 加密操作
    md5.update(sign_utf8)
    # 生成密文
    md5_server = md5.hexdigest()
    # 返回最终数据
    return md5_server

    
# 注册接口
class Register(APIView):
    
    def get(self, request):
        # 接收参数
        username = request.GET.get('username', '未收到用户名')
        password = request.GET.get('password', '未收到密码')
        code = request.GET.get('code', '未收到密码')
        # 从redis获取生成好的验证码
        # mycode = r.get('code').decode('utf-8')
        # 从session获取验证码
        mycode1 = request.session.get('code', None)
        if code != mycode1:
            res = {}
            res['code'] = 405
            res['message'] = '验证码错误'
            return Response(res)
        
        # 判断有没有重名用户
        user = User.objects.filter(username=username).first()
        if user:
            # 该用户已存在
            res = {}
            res['code'] = 405
            res['message'] = '用户已经存在'
            return Response(res)
        # 进行数据入库
        user = User(
            username=username,
            password=make_password(password),
            img='',
            type=0
        )
        user.save()
        # 返回结果
        res = {}
        res['code'] = 200
        res['message'] = '注册成功'
        return Response(res)
    
# 验证码生成链接
# 导入随机函数
class Register_code(APIView):
    
    def get(self, request):
        import random
        checkcode=''
        for i in range(4):
            current=random.randrange(0,4)   #生成随机数与循环次数比对
            current1 = random.randrange(0,4)
            if current == i:
                tmp=chr(random.randint(65,90))   #65~90为ASCii码表A~Z
            elif current1 == i:
                tmp = chr(random.randint(97,122))   #97~122为ASCii码表a~z
            else:
                tmp=random.randint(0,9)
            checkcode+=str(tmp)
        res = {}
        res['code'] = 200
        res['message'] = checkcode
        print(res)
        return Response(res)
    
# 定义图片验证码 
r = redis.Redis()
class MyCode(View):
    
    # 定义随即验证颜色
    def ger_random_color(self):
        R = random.randrange(255)
        G = random.randrange(255)
        B = random.randrange(255)
        
        return (R, G, B)
    # 随机验证码
    def get(self, request):
        # 画布
        img_size = (110, 50)
        # 定义颜色
        image = Image.new('RGB', img_size, 'white')
        # 为这张画布定义画笔对象
        draw = ImageDraw.Draw(image, 'RGB')
        
        
        # 定义随机字符串
        source = ''
        with open('./myapp/text.txt', 'r', encoding='utf-8') as f:
            for i in f.read():
                source += i
        # 定义容器
        code_str = ''
        # 定义字体
        font = ImageFont.truetype(font="C:\\Windows\Fonts\\simfang.ttf",
                                  size=28, encoding="unic")
        code_str = ''
        for i in range(4):
            # 获取字体颜色
            text_color = self.ger_random_color()
            # 获取字符串
            tmp_num = random.randrange(len(source))
            # 获取字符集
            random_str = source[tmp_num]
            # 添加到容器中
            code_str += random_str
            # 绘制
            draw.text((10+30*i,20), random_str, text_color)
        # 文件流缓冲区
        buf = io.BytesIO()
        # 将图片保存到缓冲区
        image.save(buf, 'png')
        # 将随机验证码存储到redis中
        r.set('code', code_str)
        # 将随机验证码存储到session中
        request.session['code'] = code_str
        # print(request.session.get('code'))
        return HttpResponse(buf.getvalue(), 'image/png')
# 登录接口
class LognIn(APIView):
    def get(self, request):
        # 获取账户名和密码
        username = request.GET.get('username')
        password = request.GET.get('password')
        # code = request.GET.get('code')
        # mycode = r.get('code').decode('utf-8')
        # mycode = mycode.decode('utf-8')
        # print(mycode)
        # mycode = request.session.get('code', None)
        # if code != mycode:
        #     res = {}
        #     res['code'] = 405
        #     res['message'] = '验证码错误'
        #     return Response(res)
        user = User.objects.filter(username=username,password=make_password(password)).first()
        if user:
            res = {}
            res['code'] = 200
            res['message'] = '登陆成功'
            res['username'] = username
            res['uid'] = user.id
            return Response(res)
        res = {}
        res['code'] = 405
        res['message'] = '账号或密码错误,请重新输入!'
        return Response(res)

# 获取用户数据
class UserInfo(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    
    def list(self, request, *args, **kwargs):
        uid = request.GET.get('uid')
        queryset = User.objects.filter(id=uid)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    
    
class weibo_back(APIView):
    def get(self, request):
        #获取code
        code = request.GET.get('code')

        #换取网址
        access_token_url = "https://api.weibo.com/oauth2/access_token"

        #发送请求进行换取
        re_dict = requests.post(
            access_token_url,
            data={
            "client_id": '2636039333',
            "client_secret": "4e2fbdb39432c31dc5c2f90be3afa5ce",
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": "http://127.0.0.1:8000/md_admin/weibo"
            }
        )
        uid = json.loads(re_dict.text)['uid']
        # 判断是否使用过新浪登录
        user = User.objects.filter(username=str(uid)).first()
        
        sina_id = ''
        user_id = ''
        if user:
            # 登陆过
            sina_id = user.username
            user_id = user.id
        else:
            # 自动创建账号
            user = User(username=str(uid),password='',type=0)
            # 保存
            user.save()
            # 查询用户id
            user = User.objects.filter(username=str(uid)).first()
            
            sina_id = str(uid)
            user_id = user.id
        print(sina_id)
        print(user_id)
        r.set('sinaUid', str(uid))
        return HttpResponseRedirect("http://127.0.0.1:8080/weibo")